# A.3.3 节代码：memory_manager.py
# 模拟 Redis 数据库 (一个简单的 Python 字典)
MOCK_REDIS_DB = {}


class MemoryManager:
	"""
	一个简单的记忆管理器类，模拟 LangChain 的 ChatMessageHistory。
	"""

	# 构造函数：在创建对象时自动运行
	def __init__(self, user_id: str):
		# self.user_id 是对象的属性，用于区分不同的用户
		self.user_id = user_id
		print(f"\nMemoryManager 对象创建成功，用户ID: {self.user_id}")
		# 尝试从模拟数据库中加载历史
		if user_id in MOCK_REDIS_DB:
			self.history = MOCK_REDIS_DB[user_id]
			print(f"\n- 成功加载历史记录: {self.history[:30]}...")
		else:
			self.history = ""
			print("\n- 历史记录为空，创建新的会话。")

	# 方法：获取格式化的历史记录
	def get_formatted_history(self) -> str:
		"""
		返回格式化后的对话历史字符串。
		"""
		# self.history 访问的是当前对象的属性
		return f"Current Conversation:\n{self.history}"

	# 方法：添加新的对话回合
	def add_message(self, human_input: str, ai_output: str):
		"""
		将新的问答对添加到历史中，并存回数据库。
		"""
		new_turn = f"Human: {human_input}\nAI: {ai_output}"
		self.history += "\n" + new_turn
		# 存回数据库 (模拟 Redis 存储)
		MOCK_REDIS_DB[self.user_id] = self.history
		print("\n- 记忆已更新并存入数据库。")


# --- 主程序执行部分 ---
if __name__ == "__main__":
	# 1. 创建第一个用户对象 (User A)
	user_a_manager = MemoryManager(user_id="USER_A_001")
	# 2. 调用对象的方法进行操作
	user_a_manager.add_message("Hello, what is your name?", "My name is Alex.")
	# 3. 打印格式化后的历史
	print("\n--- User A 第一次对话后的历史 ---")
	print(user_a_manager.get_formatted_history())
	# 4. 创建第二个用户对象 (User B)
	print("\n--- 启动第二个用户 (验证隔离) ---")
	user_b_manager = MemoryManager(user_id="USER_B_002")
	user_b_manager.add_message("What is the capital of France?", "The capital is Paris.")
	# 5. 再次加载 User A (验证记忆隔离)
	print("\n--- 再次加载 User A (验证隔离) ---")
	user_a_reloaded = MemoryManager(user_id="USER_A_001")
	# 预期结果：User A 的历史应该和 User B 的历史是独立的
	print("\n--- User A 重新加载后的历史 ---")
	print(user_a_reloaded.get_formatted_history())